package karaoke.dao;

import karaoke.excepcion.DAOExcepcion;
import karaoke.modelo.Reserva;
import karaoke.util.ConexionBD;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class ReservaDAO extends BaseDAO {

    public List<Reserva> buscarPorCodigo(String codigo) throws DAOExcepcion {
        String query = "SELECT A.*, CONCAT(B.NOMBRE,' ',B.APELLIDO_PATERNO) AS 'NOMBRE_CLIENTE' FROM RESERVA A, CLIENTE B "
                    + "WHERE A.FK_ID_CLIENTE = B.ID_CLIENTE AND CODIGO LIKE ?";
        List<Reserva> lista = new ArrayList<Reserva>();
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            con = ConexionBD.obtenerConexion();
            stmt = con.prepareStatement(query);
            stmt.setString(1, "%" + codigo + "%");
            rs = stmt.executeQuery();

            SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
            
            while (rs.next()) {
                Reserva reserva = new Reserva();
                reserva.setIdReserva(rs.getInt("ID_RESERVA"));
                reserva.setCodigo(rs.getString("CODIGO"));
                reserva.setFecha(rs.getDate("FECHA"));
                reserva.setFechaFormato(sdf.format(reserva.getFecha()));
                reserva.setDescripcion(rs.getString("DESCRIPCION"));
                reserva.setEstado(rs.getString("ESTADO"));
                reserva.setIdCliente(rs.getInt("FK_ID_CLIENTE"));
                reserva.setNombreCliente(rs.getString("NOMBRE_CLIENTE"));
                lista.add(reserva);
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarResultSet(rs);
            this.cerrarStatement(stmt);
            this.cerrarConexion(con);
        }
        System.out.println(lista.size());
        return lista;
    }

    public Reserva insertar(Reserva reserva) throws DAOExcepcion {
        String query = "INSERT INTO RESERVA (CODIGO,FECHA,DESCRIPCION,ESTADO,FK_ID_CLIENTE) values (?,?,?,?,?)";
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            con = ConexionBD.obtenerConexion();
            stmt = con.prepareStatement(query);
            stmt.setString(1, reserva.getCodigo());
            stmt.setDate(2, new java.sql.Date(reserva.getFecha().getTime()));
            stmt.setString(3, reserva.getDescripcion());
            stmt.setString(4, reserva.getEstado());
            stmt.setInt(5, reserva.getIdCliente());

            int i = stmt.executeUpdate();
            if (i != 1) {
                throw new SQLException("No se pudo insertar");
            }
            // Obtener el ultimo id
            int id = 0;
            query = "SELECT LAST_INSERT_ID()";
            stmt = con.prepareStatement(query);

            rs = stmt.executeQuery();

            if (rs.next()) {
                id = rs.getInt(1);
            }
            reserva.setIdReserva(id);
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarResultSet(rs);
            this.cerrarStatement(stmt);
            this.cerrarConexion(con);
        }
        return reserva;
    }

    public Reserva obtener(int idReserva) throws DAOExcepcion {
        Reserva reserva = new Reserva();
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            String query = "SELECT A.*, CONCAT(B.NOMBRE,' ',B.APELLIDO_PATERNO) AS NOMBRE_CLIENTE FROM RESERVA A, CLIENTE B WHERE ID_RESERVA=?";
            con = ConexionBD.obtenerConexion();
            stmt = con.prepareStatement(query);
            stmt.setInt(1, idReserva);
            rs = stmt.executeQuery();
            
            SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
            
            if (rs.next()) {
                reserva.setIdReserva(rs.getInt("ID_RESERVA"));
                reserva.setCodigo(rs.getString("CODIGO"));
                reserva.setFecha(rs.getDate("FECHA"));
                reserva.setFechaFormato(sdf.format(reserva.getFecha()));
                reserva.setDescripcion(rs.getString("DESCRIPCION"));
                reserva.setEstado(rs.getString("ESTADO"));
                reserva.setIdCliente(rs.getInt("FK_ID_CLIENTE"));
                reserva.setNombreCliente(rs.getString("NOMBRE_CLIENTE"));
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarResultSet(rs);
            this.cerrarStatement(stmt);
            this.cerrarConexion(con);
        }
        return reserva;
    }

    public void eliminar(int idReserva) throws DAOExcepcion {
        String query = "DELETE FROM RESERVA WHERE ID_RESERVA = ?";
        Connection con = null;
        PreparedStatement stmt = null;
        try {
            con = ConexionBD.obtenerConexion();
            stmt = con.prepareStatement(query);
            stmt.setInt(1, idReserva);
            int i = stmt.executeUpdate();
            if (i != 1) {
                throw new SQLException("No se pudo eliminar");
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarStatement(stmt);
            this.cerrarConexion(con);
        }
    }

    public Reserva actualizar(Reserva reserva) throws DAOExcepcion {
        String query = "UPDATE RESERVA SET DESCRIPCION=?,ESTADO=?, FK_ID_CLIENTE=? WHERE ID_RESERVA=?";
        Connection con = null;
        PreparedStatement stmt = null;
        try {
            con = ConexionBD.obtenerConexion();
            stmt = con.prepareStatement(query);
            stmt.setString(1, reserva.getDescripcion());
            stmt.setString(2, reserva.getEstado());
            stmt.setInt(3, reserva.getIdCliente());
            stmt.setInt(4, reserva.getIdReserva());
            int i = stmt.executeUpdate();
            if (i != 1) {
                throw new SQLException("No se pudo actualizar");
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarStatement(stmt);
            this.cerrarConexion(con);
        }
        return reserva;
    }

    public List<Reserva> listar() throws DAOExcepcion {
        List<Reserva> lista = new ArrayList<Reserva>();
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            con = ConexionBD.obtenerConexion();
            String query = "SELECT A.*, CONCAT(B.NOMBRE,' ',B.APELLIDO_PATERNO) AS 'NOMBRE_CLIENTE' FROM RESERVA A, CLIENTE B "
                    + "WHERE A.FK_ID_CLIENTE = B.ID_CLIENTE";
            stmt = con.prepareStatement(query);
            rs = stmt.executeQuery();
            
            SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
            
            while (rs.next()) {
                Reserva reserva = new Reserva();
                reserva.setIdReserva(rs.getInt("ID_RESERVA"));
                reserva.setCodigo(rs.getString("CODIGO"));
                reserva.setFecha(new Date(rs.getDate("FECHA").getTime()));
                reserva.setFechaFormato(sdf.format(reserva.getFecha()));
                reserva.setDescripcion(rs.getString("DESCRIPCION"));
                reserva.setEstado(rs.getString("ESTADO"));
                reserva.setIdCliente(rs.getInt("FK_ID_CLIENTE"));
                reserva.setNombreCliente(rs.getString("NOMBRE_CLIENTE"));
                lista.add(reserva);
            }

        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarResultSet(rs);
            this.cerrarStatement(stmt);
            this.cerrarConexion(con);
        }
        return lista;
    }

}
